#include <reg52.h>
#include <intrins.h>  // 包含 <intrins.h> 头文件

sbit IN1 = P0^0;  // 连接到ULN2003A的IN1
sbit IN2 = P0^1;  // 连接到ULN2003A的IN2
sbit IN3 = P0^2;  // 连接到ULN2003A的IN1
sbit IN4 = P0^3;  // 连接到ULN2003A的IN2



unsigned int pwm_duty = 128;  // PWM占空比，范围0-255
unsigned int pwm_count = 0;   // PWM计数器

/**
 * @brief 延时1000毫秒的函数
 * 
 * 此函数用于在11.0592MHz的晶振频率下实现大约1000毫秒的延时。
 * 它通过嵌套循环和递减变量来控制延时的时间。
 * 
 * @param 无
 * @return 无
 */
void Delay1000ms()		//@11.0592MHz
{
    unsigned char i, j, k;
    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void delay(unsigned int time) {
    unsigned int i;
    for(i = 0; i < time; i++)
    {
        Delay1000ms();
    }
}

/**
 * @brief 定时器0中断服务程序
 * 
 * 此函数用于生成PWM信号。
 * 通过定时器中断来切换电机控制引脚的电平。
 * 
 * @param 无
 * @return 无
 */
void Timer0_ISR(void) interrupt 1 {
    TH0 = 0xFC;  // 重装定时器初值，1ms定时
    TL0 = 0x18;

    if (pwm_count < pwm_duty) {
        IN1 = 1;  // 电机正转
        IN2 = 0;
				IN3 = 1;
				IN4 = 0;
    } else {
        IN1 = 0;  // 电机停止
        IN2 = 0;
				IN3 = 0;
				IN4 = 0;
    }

    pwm_count++;
    if (pwm_count >= 256) {
        pwm_count = 0;
    }
}

void main() {
    TMOD = 0x01;  // 设置定时器0为模式1（16位定时器）
    TH0 = 0xFC;   // 设置定时器初值，1ms定时
    TL0 = 0x18;
    ET0 = 1;      // 使能定时器0中断
    EA = 1;       // 使能全局中断
    TR0 = 1;      // 启动定时器0

    while(1) {
        // 调整PWM占空比
        pwm_duty = 72;  // 实际占空比约为 72/255 * 100% ≈ 28.24%
        delay(5);

        pwm_duty = 64;  // 实际占空比约为 64/255 * 100% ≈ 25.10%
        delay(5);

        pwm_duty = 32;  // 实际占空比约为 32/255 * 100% ≈ 12.55%
        delay(5);
    }
}